package com.bestcem.xm.user.dao.mapper;

import com.bestcem.xm.user.entity.mysql.UserGroup;
import com.bestcem.xm.user.entity.pojo.ListUserGroupParamDO;
import com.bestcem.xm.user.entity.pojo.SearchDO;
import com.bestcem.xm.user.entity.pojo.SearchGroupsDO;
import com.bestcem.xm.user.entity.pojo.UserGroupDO;
import com.bestcem.xm.user.grpc.service.param.PageParam;
import com.bestcem.xm.user.service.dto.group.GroupBaseDTO;
import com.bestcem.xm.user.service.dto.group.GroupNodeDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 组织 mapper
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/1/4 10:30
 */
@Mapper
public interface UserGroupMapper {

    /**
     * 根据组织id查询组织信息
     *
     * @param groupId 组织id
     * @return com.bestcem.xm.user.entity.mysql.UserGroup
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 17:59
     */
    UserGroup selectByPrimaryKey(@Param("groupId") String groupId);

    /**
     * 根据相关参数查询组织列表信息
     *
     * @param userGroup 查询参数
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.UserGroup>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:00
     */
    List<UserGroup> selectByRecord(UserGroup userGroup);

    /**
     * 根据组织id列表查询组织列表信息
     *
     * @param groupIdsList 组织id列表信息
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.UserGroup>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:06
     */
    List<UserGroup> selectByGroupIds(List<String> groupIdsList);

    /**
     * 根据user_id获取用户组列表信息
     *
     * @param userId 用户Id
     * @return list<UserGroup>用户组列表信息
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 11:20
     */
    List<UserGroup> listGroupByUserId(@Param("userId") String userId);


    /**
     * 根据user_id获取用户组列表信息
     *
     * @param userId 用户Id
     * @return list<UserGroup>用户组列表信息
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 11:20
     */
    List<UserGroup> listGroupByUserIdAndOrder(@Param("userId") String userId);

    /**
     * 根据用户id和状态查询
     *
     * @param userId 用户id
     * @param status 状态
     * @return list of user
     */
    List<UserGroup> listByUserIdAndStatus(@Param("userId") String userId, @Param("status") Integer status);

    /**
     * 根据orgId查询根组织id
     *
     * @param orgId 租户id
     * @return com.bestcem.xm.user.entity.mysql.UserGroup
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:04
     */
    UserGroup getRootGroupByOrgId(@Param("orgId") String orgId);

    /**
     * 根据主键id删除组织信息
     *
     * @param groupId 组织id
     * @return int
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:00
     */
    int deleteByPrimaryKey(@Param("groupId") String groupId);

    /**
     * 新增组织
     *
     * @param param 新增参数
     * @return String
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 12:01
     */
    Integer insertSelective(UserGroup param);

    /**
     * 批量保存组织信息
     *
     * @param userGroups 组织信息列表
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:05
     */
    Integer insertBatch(@Param("userGroups") List<UserGroup> userGroups);

    /**
     * 根据主键id更新相关字段信息
     *
     * @param param 组织参数信息
     * @return int 更新成功的条数
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:02
     */
    int updateByPrimaryKeySelective(UserGroup param);

    /**
     * 分页查询组织列表信息
     *
     * @param userGroup 相关请求参数
     * @param statuses  状态列表
     * @param pageSize  分页大小
     * @param offset    偏移量
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.UserGroup>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/11 21:10
     */
    List<UserGroup> pageByRecord(@Param("userGroup") UserGroup userGroup, @Param("statuses") List<Integer> statuses, @Param("pageSize") int pageSize, @Param("offset") int offset);

    /**
     * 根据相关条件统计用户组数量
     *
     * @param userGroup
     * @param statuses
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:42
     */
    long countByRecord(@Param("userGroup") UserGroup userGroup, @Param("statuses") List<Integer> statuses);


    /**
     * 更新组织状态为组织失效
     *
     * @param groupId
     * @param vesion
     * @param userId
     * @param operateTime
     * @param srcStatus
     * @param dstStatus
     * @return java.lang.Boolean
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:44
     */
    int invalidUserGroup(@Param("groupId") String groupId, @Param("vesion") Integer vesion,
                         @Param("userId") String userId, @Param("operateTime") Date operateTime,
                         @Param("srcStatus") Integer srcStatus, @Param("dstStatus") Integer dstStatus);

    /**
     * 根据租户id和组织id查询
     *
     * @param orgId
     * @param groupIdsList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:45
     */
    List<UserGroup> getGroupsByOrgIdAndGroupIds(@Param("orgId") String orgId, @Param("groupIdsList") List<String> groupIdsList);

    /**
     * 根据层级id和组织id查询
     *
     * @param groupLevelId
     * @param groupIdList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:45
     */
    List<UserGroupDO> listByLevelIdAndGroupIds(String groupLevelId, List<String> groupIdList);

    /**
     * 根据组织id查询子组织
     *
     * @param id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroup>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:45
     */
    List<UserGroup> getChildrenByGroupId(@Param("groupId") String id);

    /**
     * 根据组织id查询子组织
     *
     * @param id
     * @param statuses
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroup>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:45
     */
    List<UserGroup> listChildrenByGroupIdAndStatus(@Param("groupId") String id, @Param("statuses") List<Integer> statuses);

    /**
     * 根据租户id和组织编码查询组织
     *
     * @param orgId
     * @param groupCodes
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroup>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:45
     */
    List<UserGroup> getByOrgIdAndGroupCodes(@Param("orgId") String orgId, @Param("groupCodes") Set<String> groupCodes);

    /**
     * 搜索用户组列表
     *
     * @param paramDO 查询参数
     * @return com.bestcem.xm.user.entity.mysql.UserGroup
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:32
     */
    List<UserGroup> listUserGroup(@Param("param") ListUserGroupParamDO paramDO);

    /**
     * 搜索用户组列表总数
     *
     * @param paramDO 查询参数
     * @return com.bestcem.xm.user.entity.mysql.UserGroup
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:32
     */
    Long listUserGroupCount(@Param("param") ListUserGroupParamDO paramDO);

    /**
     * 获取子组织id列表
     *
     * @param orgId   公司id
     * @param groupId 组织id
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:57
     */
    List<String> getAllSubGroupByGroupId(@Param("orgId") String orgId, @Param("groupId") String groupId);

    /**
     * 分页获取子组织组织
     *
     * @param subGroupList 子组织的id列表
     * @param start        当前页
     * @param size         页大小
     * @return com.bestcem.xm.user.service.dto.group.PageDTO<com.bestcem.xm.user.service.dto.group.GroupBaseDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:34
     */
    List<GroupBaseDTO> getSubGroupByPage(@Param("subGroupList") List<String> subGroupList, @Param("start") Integer start, @Param("size") Integer size);

    /**
     * 分页获取子组织组织总数
     *
     * @param subGroupList 子组织的id列表
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:34
     */
    Integer getSubGroupBaseCount(List<String> subGroupList);

    /**
     * 根据groupId查找指定状态的子用户组列表
     *
     * @param groupId
     * @param statusList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 16:50
     */
    List<UserGroupDO> getChildrenListByRootGroupId(String groupId, List<Integer> statusList);

    /**
     * 根据groupId查找指定状态的用户组和子用户组列表数量
     *
     * @param groupId    用户组id
     * @param statusList 状态列表
     * @return java.lang.Integer
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:11
     */
    Integer getSelfAndChildrenCountByGroupId(@Param("groupId") String groupId, @Param("statusList") List<Integer> statusList);

    /**
     * 查找指定租户下指定层级、状态的用户组列表并排序
     *
     * @param userGroup
     * @param pageParam
     * @param statusList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:12
     */
    List<UserGroupDO> getListByOrgId(@Param("userGroup") UserGroup userGroup, PageParam pageParam, List<Integer> statusList);

    /**
     * 查找指定租户下指定层级、状态的用户组列表数量
     *
     * @param userGroup  查询参数
     * @param statusList 状态列表
     * @return int
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:13
     */
    int countByConditionAndSort(@Param("userGroup") UserGroup userGroup, List<Integer> statusList);

    /**
     * 根据父组织id获取公司的用户组数量
     *
     * @param groupId    父组织id
     * @param statusList 状态列表
     * @return int
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:14
     */
    int userGroupCountByParentGroupId(String groupId, List<Integer> statusList);

    /**
     * 根据parentGroupId查找指定状态的子用户组列表 并支持排序和分页
     *
     * @param groupId
     * @param pageParam
     * @param statusList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:27
     */
    List<UserGroupDO> getListByParentGroupId(String groupId, PageParam pageParam, List<Integer> statusList);

    /**
     * 获取租户下指定层级、状态下的用户组数量
     *
     * @param userGroup  查询参数
     * @param statusList 状态列表
     * @return int
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/10 17:30
     */
    Integer userGroupCountByOrgId(UserGroup userGroup, List<Integer> statusList);

    /**
     * 根据用户组id列表获取指定层级上的子用户组数量
     *
     * @param groupLevelId
     * @param groupIdsList
     * @return long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:51
     */
    Long countSubRelate(@Param("groupLevelId") String groupLevelId, @Param("groupIdsList") List<String> groupIdsList);

    /**
     * 根据用户组id列表分页获取指定层级上的子用户列表
     *
     * @param groupLevelId 层级id
     * @param groupIdsList 组织id列表
     * @param pageSize     每页大小
     * @param offset       第几页
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/07 10:07
     */
    List<UserGroup> listPageSubRelate(@Param("groupLevelId") String groupLevelId, @Param("groupIdsList") List<String> groupIdsList,
                                      @Param("pageSize") int pageSize, @Param("offset") int offset);

    /**
     * 查询指定父组织下一层的状态为【有效，隐藏的数量】
     *
     * @param parentGroupId 父组织id
     * @param orgId         租户id
     * @param statuses      状态列表
     * @return long 数量
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 15:16
     */
    long countChild(@Param("parentGroupId") String parentGroupId, @Param("orgId") String orgId, @Param("statuses") List<Integer> statuses,
                    @Param("parentIds") Set<String> parentIds, @Param("currentIds") Set<String> currentIds);

    /**
     * 查询指定父组织下一层的状态为【有效，隐藏的列表】
     *
     * @param parentGroupId 父组织id
     * @param orgId         租户id
     * @param statuses      状态列表
     * @param size          每页大小
     * @param offset        偏移量
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 15:25
     */
    List<UserGroup> listChild(@Param("parentGroupId") String parentGroupId, @Param("orgId") String orgId,
                              @Param("statuses") List<Integer> statuses,
                              @Param("parentIds") Set<String> parentIds, @Param("currentIds") Set<String> currentIds,
                              @Param("size") Integer size, @Param("offset") int offset);

    /**
     * 通过组织id和版本号更新组织
     *
     * @param versionId 历史版本号
     * @param param     更新参数
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    int updateByIdAndVersion(@Param("versionId") Integer versionId, @Param("param") UserGroup param);

    /**
     * 通过组织id和版本号更新组织(考虑null)
     *
     * @param versionId
     * @param param
     * @return int
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/8/9 15:43
     */
    int updateByIdAndVersionWithNull(@Param("versionId") Integer versionId, @Param("param") UserGroup param);

    /**
     * 通过组织id和版本号更新组织(带groupParentIds)
     *
     * @param versionId 历史版本号
     * @param param     更新参数
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    int updateByIdAndVersionWithParentIds(@Param("versionId") Integer versionId, @Param("param") UserGroup param);


    /**
     * 批量通过组织id更新组织(带groupParentIds)
     *
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    int batchUpdateById(@Param("params") List<UserGroup> param);

    /**
     * 根据层级id查询组织
     *
     * @param levelIds 层级id集合
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:52
     */
    List<String> listGroupByLevelIds(List<String> levelIds);

    /**
     * 根据用户组名称和层级Id
     *
     * @param groupName
     * @param groupParentId
     * @param groupLevelId
     * @param orgId
     * @param statusList
     * @return long
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 15:26
     */
    long getByNameAndLevelId(String groupName, String groupParentId, String groupLevelId, String orgId, ArrayList<Integer> statusList);

    /**
     * 设置组织负责人
     *
     * @param group 可选参数
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 17:48
     */
    int setAdminId(@Param("group") UserGroup group);

    /**
     * 可选参数
     *
     * @param param 可选参数
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 17:48
     */
    int updateByPrimaryKey(@Param("param") UserGroup param);

    /**
     * 根据组织id查询所有的组织列表信息
     *
     * @param groupIds 组织Id列表
     * @return List<UserGroup>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 15:50
     */
    List<UserGroup> selectByIds(@Param("groupIds") List<String> groupIds);

    /**
     * 统计指定状态下的用户组数
     *
     * @param searchDO 组织层级Id
     * @return 指定状态下的用户组数
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/02/08 20:38
     */
    long countBySearch(@Param("param") SearchDO searchDO, @Param("levelIds") List<String> parentLevelIds,
                       @Param("parentIds") Set<String> parentIds, @Param("currentIds") Set<String> currentIds);

    /**
     * 查询指定状态下的用户组列表
     *
     * @param searchDO 搜索条件  pageSize 页面大小  currentPage 当前页
     * @return UserGroupDO
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/02/08 20:38
     */
    List<UserGroup> groupPage(@Param("param") SearchDO searchDO, @Param("levelIds") List<String> parentLevelIds,
                              @Param("parentIds") Set<String> parentIds, @Param("currentIds") Set<String> currentIds,
                              @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     * 根据org_id 获取组织结构，控制是否分页
     *
     * @param orgId    公司id
     * @param offset   偏移量
     * @param size     页大小
     * @param pageFlag 是否分页
     * @return java.util.List<com.bestcem.xm.user.service.dto.group.UserGroupDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 19:07
     */
    List<UserGroupDO> listByOrgIdOrPage(@Param("orgId") String orgId, @Param("offset") Integer offset, @Param("size") Integer size, @Param("pageFlag") boolean pageFlag);

    /**
     * 查询指定节点下不在某颗子树下的指定状态的子节点数量
     *
     * @param groupId  组织id
     * @param statuses 状态列表
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/18 16:38
     */
    Integer getOtherChildrenCount(@Param("groupId") String groupId, @Param("statuses") List<Integer> statuses);

    /**
     * 删除指定组织下指定状态的子组织的parentIds数组上指定位数上的数据
     *
     * @param groupId 组织id
     * @param status  子组织状态
     * @param seat    要删除的位置
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/18 17:07
     */
    Integer deleteChildrenSeatLocationPids(@Param("groupId") String groupId, @Param("status") Integer status, @Param("seat") int seat);

    /**
     * 更新所有的子节点的parentId为parentIds的最后一个元素
     *
     * @param parentId
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/21 13:54
     */
    Integer refreshAllChildrenParentId(@Param("orgId") String orgId, @Param("parentId") String parentId, @Param("lastNotHiddenGroup") String lastNotHiddenGroup);

    /**
     * 通过组织id列表查询组织
     *
     * @param groupIdList      组织id列表
     * @param includeChildFlag 是否包含子组织
     * @param filterStatusFlag 状态过滤
     * @param page             当前页
     * @param size             页大小
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:15
     */
    List<UserGroupDO> listByGroupIdsByUserId(@Param("groupIdList") List<String> groupIdList, @Param("includeChildFlag") Boolean includeChildFlag, @Param("filterStatusFlag") Boolean filterStatusFlag, @Param("page") Integer page, @Param("size") Integer size);

    /**
     * 通过组织id列表查询组织
     *
     * @param groupIdList      组织id列表
     * @param includeChildFlag 是否包含子组织
     * @param filterStatusFlag 状态过滤
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:15
     */
    Long listByGroupIdsByUserIdCount(@Param("groupIdList") List<String> groupIdList, @Param("includeChildFlag") Boolean includeChildFlag, @Param("filterStatusFlag") Boolean filterStatusFlag);

    /**
     * 根据指定用户组id和层级id 分页查询指定层级上的子用户组数量
     *
     * @param groupId      组id
     * @param groupLevelId 层级id
     * @param statusList   状态列表
     * @return long 满足条件的数量
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/24 12:25
     */
    long countChildrenNum(@Param("groupId") String groupId, @Param("groupLevelId") String groupLevelId, @Param("statusList") List<Integer> statusList);

    /**
     * 根据指定用户组id和层级id 分页查询指定层级上的子用户组列表
     *
     * @param groupId      组id
     * @param groupLevelId 层级id
     * @param statusList   状态列表
     * @param pageSize     每页大小
     * @param offset       当前页
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/24 12:25
     */
    List<UserGroup> listPageChildren(@Param("groupId") String groupId, @Param("groupLevelId") String groupLevelId,
                                     @Param("statusList") List<Integer> statusList, @Param("pageSize") int pageSize, @Param("offset") int offset);

    /**
     * 根据用户组id列表获取指定层级上关联的用户组信息
     *
     * @param relatedIds: 关联的组织id
     * @param page:       当前页
     * @param size:       页大小
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/24 18:43
     */
    List<GroupBaseDTO> listRelateGroups(@Param("relatedIds") List<String> relatedIds, @Param("page") Integer page, @Param("size") Integer size);

    /**
     * 根据用户组id列表获取指定层级上关联的用户组信息总数
     *
     * @param relatedIds: 关联的组织id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/24 18:43
     */
    Integer listRelateGroupsCount(@Param("relatedIds") List<String> relatedIds);


    /**
     * 获取孩子节点
     *
     * @param parentId:   父组织id
     * @param statusList: 状态集合
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/28 16:54
     */
    List<GroupNodeDTO> getChildrenGroup(@Param("parentId") String parentId, @Param("statusList") ArrayList<Integer> statusList);


    /**
     * 联表查询ds_user_group
     *
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/28 18:15
     */
    List<UserGroupDO> getGroupsByUserIdLeftJoinGroup(String userId);

    /**
     * 根据组织id列表和状态查询组织信息列表
     *
     * @param groupIds 组织id
     * @param status   状态
     * @return java.util.List<com.bestcem.xm.user.entity.mysql.UserGroup>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 17:18
     */
    List<UserGroup> listByGroupIdsAndStatus(@Param("groupIds") List<String> groupIds, @Param("status") Integer status);

    /**
     * description
     *
     * @param orgId
     * @param groupCodesList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 16:00
     */
    List<UserGroupDO> listGroupsByCodes(String orgId, List<String> groupCodesList, List<Integer> statusList);

    /**
     * 获取指定组在指定层级上的子组织关联的用户数总和
     *
     * @param userStatus   用户状态，可为空
     * @param groupId      组织id
     * @param groupLevelId 层级id
     * @return java.lang.Long
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/27 20:16
     */
    Long getSelfAndChildrenUserNum(@Param("userStatus") Integer userStatus, @Param("groupId") String groupId, @Param("groupLevelId") String groupLevelId, @Param("excludeUserId") String excludeUserId, @Param("statuses") Integer... statuses);

    /**
     * 获取当前组织下所有有效的子组织id列表
     *
     * @param groupId 组织id
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/28 16:46
     */
    List<String> getChildrenIdsByStatus(@Param("groupId") String groupId, @Param("status") Integer status);

    /**
     * 更新组织状态
     *
     * @param validGroupIds 需要更新的组织id列表
     * @param userId        操作的用户id
     * @param destStatus    目标状态
     * @param operateTime   操作时间
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/28 16:51
     */
    void updateChildrenStatus(@Param("groupIds") List<String> validGroupIds, @Param("userId") String userId,
                              @Param("destStatus") Integer destStatus, @Param("operateTime") Date operateTime);

    /**
     * 根据组织id列表查询所有的子组织列表信息
     *
     * @param groupParentIds 组织id列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 14:30
     */
    List<UserGroup> listChildrenByParentIds(@Param("groupParentIds") List<String> groupParentIds);

    /**
     * 根据groupIds和groupLevelId查询对应的节点信息
     *
     * @param groupIds 组织id列表
     * @param levelId  层级id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 14:39
     */
    List<UserGroup> listByGroupIdsAndLevelId(@Param("groupIds") List<String> groupIds, @Param("levelId") String levelId);

    /**
     * 支持模糊搜索用户组列表
     *
     * @param searchGroupsDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 21:08
     */
    List<UserGroupDO> searchGroups(@Param("param") SearchGroupsDO searchGroupsDO);

    /**
     * 支持模糊搜索用户组总数
     *
     * @param searchGroupsDO
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 21:09
     */
    Long searchGroupsCount(@Param("param") SearchGroupsDO searchGroupsDO);

    /**
     * 查询seq和orgId
     *
     * @param offset
     * @param size
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/19 22:07
     */
    List<UserGroup> getSeqAndOrgId(Integer offset, Integer size);

    /**
     * 更新隐藏节点的组织名称
     *
     * @param orgId
     * @param groupId
     * @param groupName
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/20 20:13
     */
    int updateHiddenGroupName(@Param("orgId") String orgId, @Param("groupId") String groupId, @Param("groupName") String groupName);

    /**
     * 清空某个用户的所有组织关系
     *
     * @param userId
     * @return void
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/20 20:13
     */
    void deleteRelationsOfUser(String userId);

    /**
     * 根据层级id和组织状态查询
     *
     * @param levelId
     * @param statusList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroup>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/22 00:29
     */
    List<UserGroup> getGroupByLevelIdAndStatusList(@Param("levelId") String levelId, @Param("statusList") List<Integer> statusList);

    /**
     * 所有状态为活动和隐藏的子组织
     *
     * @param orgId
     * @param groupId
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/24 16:27
     */
    List<UserGroup> getAllSubGroup(@Param("orgId") String orgId, @Param("groupId") String groupId);

    /**
     * 根据组织id查询子组织
     *
     * @param orgId
     * @param groupId
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/09/28 16:54
     */
    List<UserGroup> listSubGroupByGroupId(@Param("orgId") String orgId, @Param("groupId") String groupId);

    /**
     * 根据org_id和group_status查询所有组织
     *
     * @param orgId    租户ide
     * @param statuses 组织状态
     * @return list of group
     */
    List<UserGroup> listByOrgIdAndStatuses(@Param("orgId") String orgId, @Param("statuses") Integer... statuses);

    /**
     * 更新组织状态
     *
     * @param groupIdList 组织id列表
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/03 15:55
     */
    Integer deleteInvalidGroup(@Param("groupIdList") List<String> groupIdList);

    /**
     * 查询组织下的所有子孙组织
     *
     * @param orgId
     * @param groupId
     * @param start
     * @param size
     * @return java.util.List<java.lang.String>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/19 14:31
     */
    List<String> listChildrenByParentId(String orgId, String groupId, int start, int size);

    /**
     * 统计组织下的所有子孙组织数量
     *
     * @param orgId
     * @param groupId
     * @return java.lang.Long
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/19 18:25
     */
    Long countChildrenByParentId(String orgId, String groupId);

    /**
     * 根据主键id删除组织信息
     *
     * @param groupIds 组织id
     * @return int
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/02 18:00
     */
    int deleteByIds(List<String> groupIds);

    void updateStatusByIds(List<String> ids, Integer status);

    void updateParentIdByParentId(String oldGroupId, String newGroupId);

    void updateStatusByUserGroup(UserGroup userGroup, int status);

    List<UserGroup> selectBySelective(UserGroup userGroup, String search);

    Long countBySelective(@Param("userGroup") UserGroup userGroup, @Param("search") String search);

    List<UserGroup> selectPageBySelective(@Param("userGroup") UserGroup userGroup, @Param("search") String search, @Param("pageSize") int pageSize, @Param("offset") int offset);
}
